package persistencia;

import dominio.*;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;


public class PersistenciaFuncionario {
 //    private List<Funcionario> funcionarios = new ArrayList<Funcionario>();
        private static PersistenciaFuncionario InstanciaFuncionario;
        private Connection conn;
        
   /**
 * Conexão com o banco de dados
 * 
 */
        private PersistenciaFuncionario () {
                Conecta c = Conecta.getConnection();
                this.conn = c.conn;
        }
	 
/**
 * 
 * Singleton. Usado para que haja apenas uma conexão com o banco sendo usada no sistema
 * 
 */
        public static PersistenciaFuncionario getInstance(){
	if(InstanciaFuncionario == null) {
                        	InstanciaFuncionario = new PersistenciaFuncionario();
	    }
	 return InstanciaFuncionario;
        }     

/*
* Função que consulta o funcionario pelo nome
* retornando todos os atributos do funcionario
* @param funcionario só com nome
* @return funcionario com todos os atributos
*/
    public Funcionario consultarNome(Funcionario funcionario){
        Statement statement;
        ResultSet result;
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("SELECT * FROM Funcionario WHERE nome = "+"'"+funcionario.getNome()+"'");
            if (result.next()){
                Funcionario f = new Funcionario(result.getString("nome"), result.getString("cpf"), result.getString("endereco"), result.getString("telefone"), result.getString("cargo"));
                        return f;
            }
            else return null;
        } catch (SQLException ex) {
            System.out.println("Erro em consultar nome");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
           return null;
        }
    }
  /*
* Função que consulta o funcionario pelo cpf
* retornando todos os atributos do funcionario
* @param funcionario só com cpf
* @return funcionario com todos os atributos
*/
  
    public Funcionario consultarFuncionarioPorCpf(Funcionario funcionario){
        Statement statement;
        ResultSet result;
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("SELECT * FROM Funcionario WHERE cpf = "+"'"+funcionario.getCpf()+"'");
            if (result.next()){
                Funcionario f = new Funcionario(
                        result.getString("nome"), result.getString("cpf"), result.getString("endereco"), result.getString("telefone"), result.getString("cargo"));
                        return f;
            }
            else return null;
        } catch (SQLException ex) {
            System.out.println("Erro em consultar funcionario por cpf");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
           return null;
        }
    }

/* Função que exclui um funcionário
* @param funcionario
*/
    public void excluir(Funcionario funcionario) {
        Statement statement;

        try {
            statement = conn.createStatement();
            statement.executeUpdate("DELETE FROM Funcionario WHERE cpf = "+"'"+funcionario.getCpf()+"'");
        } catch (SQLException ex) {
            System.out.println("Erro em excluir funcionario");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

/* Função que cria lista todos os funcionarios
* presentes no banco
* @retun listafuncionarios
*/
     public ArrayList<Funcionario> listarFuncionarios () {
                ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Funcionario");
                        while (result.next()){
                                Funcionario f = new Funcionario(result.getString("nome"), result.getString("cpf"), result.getString("endereco"),result.getString("telefone"), result.getString("cargo"));
                                funcionarios.add(f);  
                        }
                        return funcionarios;
                } catch (SQLException e) {
                    System.out.println("Erro em listar funcionarios");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
        }

/* Função que cadastra um funcionario no banco de dados
* @param nome
* @param cpf
* @param endereco
* @param telefone
* @param cargo
* @return funcionario
*/

    public void cadastroFuncionario (String nome, String cpf, String endereco, String telefone,String cargo) {
            
            Statement statement;
/*
            System.out.println("Digite o nome do Funcionario: ");
            nome = Console.readString();
            System.out.println("Digite o cpf do Funcionario:");
            cpf = Console.readString();
            System.out.println("Digite o cargo do Funcionario:");
            cargo = Console.readString();
            System.out.println("Digite o endereco do Funcionario: ");
            endereco = Console.readString();
            System.out.println("Digite o telefone do Funcionario:");
            telefone = Console.readString();
  */
            Funcionario funcionario = new Funcionario(nome, cpf, endereco, telefone, cargo);
                if (consultarNome(funcionario) == null){
                    try {
                            statement = conn.createStatement();
                            statement.executeUpdate("INSERT INTO Funcionario (cpf,nome,endereco,telefone, cargo) " +
                                            "values('"+cpf+"','"+nome+"','"+endereco+"','"+telefone+"'','"+cargo+"')");
                    } catch (SQLException e) {
                        System.out.println("Erro em cadastrar funcionario");
                        //imprimir erro
                    }
                    System.out.println("Funcionário cadastrado com sucesso!");
               }
                else {
                    System.out.println("Funcionário já estava cadastrado");
                }
        }

/* Função que altera um cadastro de um funcionário
* @param cpf
*/
    public void alteraCadastroFuncionario(String cpf){
            String endereco, cargo, aux;
            String telefone;
            Statement statement;

            Funcionario funcionario = new Funcionario(null, cpf, null);
            if(consultarFuncionarioPorCpf(funcionario) != null) {
                try {
                   
                    System.out.println("Digite o endereco do funcionario");
                    endereco = Console.readString();
                    System.out.println("Digite o telefone do funcionario");
                    telefone = Console.readString();
                    System.out.println("Digite o novo cargo do funcionario");
                    cargo = Console.readString();
                    statement = conn.createStatement();
                    statement.executeUpdate("UPDATE Funcionario SET endereco =  '"+endereco+"' WHERE cpf='"+cpf+"'");
                    statement.executeUpdate("UPDATE Funcionario SET telefone =  '"+telefone+"' WHERE cpf='"+cpf+"'");
                    statement.executeUpdate("UPDATE Funcionario SET cargo =  '"+cargo+"' WHERE cpf='"+cpf+"'");

                } catch (SQLException e) {
                    System.out.println("Erro em alterar cadastro funcionario");
                        //imprime erro
                }
                System.out.println("Cadastro do Funcionário alterado com sucesso!");
            }
            else System.out.println("Funcionario não cadastrado. Cadastre-o primeiro.");
    }

/* Função que imprime uma lista de funcionarios
* @param listafuncionarios
*/

  public void imprimeLista(ArrayList<Funcionario> funcionarios) {

       for (int i=0; i < funcionarios.size(); i++) {
           System.out.println(i);
           System.out.println("Nome: "+ funcionarios.get(i).getNome());
           System.out.println("CPF: "+ funcionarios.get(i).getCpf());
           System.out.println("Endereco: "+ funcionarios.get(i).getEndereco());
           System.out.println("Telefone: "+ funcionarios.get(i).getTelefone());
           System.out.println("Cargo: " + funcionarios.get(i).getCargo());
           System.out.println();
       }
    }
}
